package com.dingreading.cloud.mall.service;

import com.dingreading.cloud.common.util.PageUtil;
import com.dingreading.cloud.mall.dto.UpdateShopCartVo;
import com.dingreading.cloud.mall.entity.ShopCart;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.service.IService;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

/**
 * 服务层。
 *
 * @author Administrator
 * @since 2023-11-22
 */
public interface ShopCartService extends IService<ShopCart> {

    Page<ShopCart> staffPageListV3(PageUtil pageUtil, String storeUid, String staffUid, String name);

    @Transactional(rollbackFor = Exception.class)
    int deleteByStaffIdAndCode(String staffUid, String code);

    List<ShopCart> getByCode(String staffUid, String code);

    boolean cancelShopCarts(String staffUid, String code);

    void setOk(String code, String payTimes);

    // 删除购物车记录和子购物车记录
    int deleteByStaffUidAndIdOrMainShopCartIds(String staffUid, List<Long> ids, List<String> mainShopCartUids);

    // 获取正常商品和组合商品的自购物车记录
    List<ShopCart> mainListByStaffUidAndCode(String staffUid, String code);

    // 按订单编号获取购物车记录（去除组合子商品记录）
    List<ShopCart> mainListByCodeIn(List<String> codes);

    // 获取正常商品和组合商品的自购物车记录
    List<ShopCart> mainListAndChildListByCode(String code);

    // 获取组合子购物车记录
    List<ShopCart> childListByStoreUidAndStaffUidAndUid(String storeUid, String staffUid, String mainShopCartUid);

    // 获取订单号为null的组合子购物车记录
    List<ShopCart> childListByStoreUidAndStaffUidAndUidsAndCodeIsNull(String storeUid, String staffUid, List<String> mainShopCartUids);

    // 购物车和组合子购物车更新订单编号
    void updateFormInfo(List<String> shopCartUids, String code);

    // 获取员工购物车商品总数量
    long getStaffShopCartCountV3(String storeUid, String staffUid, int type);

    ShopCart getByStaffIdAndGoodsIdAndTypeId(String storeUid, String staffUid, Long goodsId, Long goodsTypeId, Integer mainComboType, Integer comboType);

    // 根据购买记录和出库记录获取商品规格的待出库数量
    int getWaitSendNum(Long goodsTypeId);

    // 根据购买记录和出库记录获取商品规格的待出库数量集合
    Map<Long, Integer> getWaitSendNum(List<Long> goodsTypeIds);

    // 更新购物车的信息
    boolean updateShopCartInfo(
            String staffUid, Long id, Double unitPrice, Double price, Double weight, double totalWeight,
            Integer num, Double originalUnitPrice,Double originalPrice, Double discountRate, double discountPrice
    );

    // 关联查询获取包邮模板信息
    List<ShopCart> listRelationByIdIn(List<Long> shopCartIds);

    List<ShopCart> listRelationByIdInOrderByPrice(List<Long> shopCartIds);

    // 我的购物车列表
    List<ShopCart> myShopCarts(String storeUid, String staffUid);

    // 批量更新购物车商品的金额信息
    void dbUpdatePriceInfo(List<UpdateShopCartVo> voList);

    // 批量更新购物车商品的包邮状态
    void dbUpdateDeliveryStatus(List<UpdateShopCartVo> voList);
}
